#include "Piso.h"

#define ELEMENTO_INDEFINIDO 0

using namespace TP::Juego::Arena::Utilidades;

Piso::Piso() {
	_rol = new Rol(ROL_PISO, DESC_PISO);
	_vida = VIDA_PISO;
	setEsEnemigo(true);
	_posicion = new Posicion(0, 0);
}

void Piso::addPunto(Posicion *punto) {
	vec_puntos.push_back(punto);
}

Utilidad* Piso::clonar() {
	Piso *copia = new Piso;
	Posicion *posicion;
	for (unsigned i = 0; i < vec_puntos.size(); ++i) {
		posicion = vec_puntos[i]->clonar();
		copia->vec_puntos.push_back(posicion);
	}
	return copia;
}

const std::vector<Posicion*>& Piso::getVectorPosiciones() const {
	return vec_puntos;
}

Piso::~Piso() {
	for (unsigned i = 0; i < vec_puntos.size(); ++i) {
		delete vec_puntos[i];
	}
	if (_posicion != NULL) {
		delete _posicion;
	}
}

double Piso::getRadio() {
	return radio_piso;
}

int Piso::getPuntosDestruccion() {
	return PUNTAJE_PISO;
}

TiXmlElement* Piso::aElementoXML() {
	TiXmlElement * element = Utilidad::aElementoXML();

	TiXmlElement *pisos = new TiXmlElement("Puntos");

	for (size_t i = 0; i < vec_puntos.size(); ++i)
		pisos->LinkEndChild(vec_puntos[i]->aElementoXML());

	element->LinkEndChild(pisos);

	return element;
}

void Piso::deElementoXML(TiXmlElement* pElemento) {
	if (pElemento->Value() == _rol->Nombre()) {
		try {
			TiXmlElement* posicionXml = pElemento->FirstChildElement();
			if (!posicionXml) throw ELEMENTO_INDEFINIDO;

			Posicion* posicion = new Posicion();
			posicion->deElementoXML(posicionXml);
			this->setPosicion(posicion);

			TiXmlElement* puntos = posicionXml->NextSiblingElement();
			if (!puntos) throw ELEMENTO_INDEFINIDO;

			TiXmlElement* cursor = puntos->FirstChildElement();
			while (cursor) {
				posicion = new Posicion();
				posicion->deElementoXML(cursor);
				vec_puntos.push_back(posicion);
				cursor = cursor->NextSiblingElement();
			}
		}
		catch (int pEx) {
			/*Skip.*/
		}
	}
}